export const saveCallAsync = async (fn, target, ...params)=>{
	let ex, resp = null
	
	try{
		resp = await fn.call(target, ...params)
	}catch(err){
		ex = err
	}
	
	return [ex, resp]
}

export const saveCall = (fn, target, ...params)=>{
	let ex, resp = null
	
	try{
		resp = fn.call(target, ...params)
	}catch(err){
		ex = err
	}
	
	return [ex, resp]
}

export const sleep = (ms)=>{
	return new Promise((resolve, reject)=>{
		setTimeout(resolve, ms)
	})
}

const padLeftZero = function(str){
    return str.length >= 2 ? str : '0'+str
}
export const formatDate = (fmt, date)=>{
	if(!date){
		date = new Date()
	}else if(!(date instanceof Date)){
        date = new Date(date)
    }

    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    }
    let o = {
        'M+': date.getMonth() + 1,
        'd+': date.getDate(),
        'h+': date.getHours(),
        'm+': date.getMinutes(),
        's+': date.getSeconds()
    };
    for (let k in o) {
        if (new RegExp(`(${k})`).test(fmt)) {
            let str = o[k] + '';
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? str : padLeftZero(str));
        }
    }

    return fmt;
}